/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package runebound.manejadores;

import runebound.manejadores.eventos.RBEventoAventuraEncontrada;
import runebound.manejadores.eventos.RBEventoDadoMovimientoSeleccionado;
import runebound.manejadores.eventos.RBEventoEntradaCiudad;
import runebound.manejadores.eventos.RBEventoFinMovimiento;
import runebound.manejadores.eventos.RBEventoInicioCombate;
import runebound.manejadores.eventos.RBEventoJuego;
import runebound.manejadores.eventos.RBEventoMovimiento;
import runebound.manejadores.eventos.RBEventoNuevoTurno;
import runebound.manejadores.eventos.combate.RBEventoCombate;
import runebound.modelo.heores.Heroe;
import runebound.modelo.monstruos.Monstruo;
import runebound.ui.RBWindow;
import runebound.ui.ciudad.RBCiudadDialog;
import runebound.ui.mapa.EstadoTileMapa;
import runebound.ui.mapa.TileMapa;

/**
 *
 * @author Miguel (alakat@gmail.com)
 */
public class RBMaquinaEstadosJuego {

    private RBControladorJuego controladorJuego;

    public RBMaquinaEstadosJuego(RBControladorJuego controladorJuego) {
        this.controladorJuego = controladorJuego;
    }
    
    
    
    void recibirEvento(RBEventoJuego evento) {
        if(evento instanceof RBEventoDadoMovimientoSeleccionado){
            this.dadoMovimientoSeleccionado(((RBEventoDadoMovimientoSeleccionado)evento));
        }else if(evento instanceof RBEventoMovimiento){
            this.movimientoHeroe((RBEventoMovimiento)evento);
        }else if(evento instanceof RBEventoFinMovimiento){
            this.finMovimiento((RBEventoFinMovimiento)evento);
        }else if(evento instanceof RBEventoNuevoTurno){
            this.nuevoTurno((RBEventoNuevoTurno)evento);
        }else if(evento instanceof RBEventoAventuraEncontrada){
            this.aventuraEncontrada((RBEventoAventuraEncontrada)evento);
        }else if(evento instanceof RBEventoCombate){
            this.controladorJuego.getControladorCombate().recibirEventoCombate((RBEventoCombate)evento);
        }else if(evento instanceof RBEventoEntradaCiudad){
            this.procesarEntrarCiudad((RBEventoEntradaCiudad)evento);
        }
        
    }

    private void dadoMovimientoSeleccionado(RBEventoDadoMovimientoSeleccionado rbEventoDadoMovimientoSeleccionado) {
        this.controladorJuego.getWindow().getMapaPanel().setNuevoTerrenoAccesible(rbEventoDadoMovimientoSeleccionado.getDadoSeleccionado());
    }

    
    /**
     * Porcesamiento del movimiento del héroe
     * @param rbEventoMovimiento 
     */
    private void movimientoHeroe(RBEventoMovimiento rbEventoMovimiento) {
        //Asignamos tiles activos
        this.controladorJuego.getWindow().getMapaPanel().setTileActivo(rbEventoMovimiento.getDestino());
        //Situamos el Heroe
        rbEventoMovimiento.getOrigen().getHeroe().remove(rbEventoMovimiento.getHeroe());
        rbEventoMovimiento.getDestino().getHeroe().add(rbEventoMovimiento.getHeroe());
        rbEventoMovimiento.getDestino().setEstado(EstadoTileMapa.HEROE_ACTIVO);
        //Indicamos que el dado ha sido usado
        controladorJuego.getWindow().getRBDadosMovimientoPanel().setDadoUsado();
        
        controladorJuego.getWindow().repaint();;
    }

    /**
     * Procesamiento de fin del movimiento del héroe activo
     * @param rBEventoFinMovimiento 
     */
    private void finMovimiento(RBEventoFinMovimiento rBEventoFinMovimiento) {
        if(controladorJuego.getWindow().getMapaPanel().getTileActivo().isAventura()){
            TileMapa tmActivo = controladorJuego.getWindow().getMapaPanel().getTileActivo();
            controladorJuego.recibirEvento(new RBEventoAventuraEncontrada(
                    tmActivo.getGema().getTipoAmenaza(), 
                    controladorJuego.getHeroeActivo(), 
                    tmActivo));
        }else if(controladorJuego.getWindow().getMapaPanel().getTileActivo().isCiudad()){
            controladorJuego.recibirEvento(
                    new RBEventoEntradaCiudad(
                            controladorJuego.getWindow().getMapaPanel().getTileActivo().getCiudad()));
        }else{
            controladorJuego.recibirEvento(new RBEventoNuevoTurno());
        }
        
        
    }

    private void nuevoTurno(RBEventoNuevoTurno rbEventoNuevoTurno) {
        //TODO cambio de jugador, contador de fin de partida, etc...
        controladorJuego.nuevoTurno();
    }

    private void aventuraEncontrada(RBEventoAventuraEncontrada rbEventoAventuraEncontrada) {
        //TODO AVENTURA!
        //controladorJuego.recibirEvento(new RBEventoNuevoTurno());
        Monstruo m = this.controladorJuego.getControladorAventura().getNuevoMonstruo(rbEventoAventuraEncontrada.getAmenaza());
        Heroe h = this.controladorJuego.getHeroeActivo();
        RBEventoInicioCombate evento = new RBEventoInicioCombate(h, m);
        this.controladorJuego.nuevoCombate(h, m);
        this.controladorJuego.recibirEvento(evento);
        
    }

    /**
     * Nos muestra a ciudad y desactiva el movimeinto
     * @param rbEventoEntradaCiudad 
     */
    private void procesarEntrarCiudad(RBEventoEntradaCiudad rbEventoEntradaCiudad) {
        controladorJuego.getWindow().getRBDadosMovimientoPanel().setNuevoTurno();
        RBCiudadDialog ciudadDialog = new RBCiudadDialog(
                RBControladorJuego.getInstance().getWindow(), 
                false,
                rbEventoEntradaCiudad.getCiudad());
        ciudadDialog.setVisible(true);
    }
    
}
